package com.zzw.aspect;

import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.*;

@Intercepts({
        @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
public class ExcelAnnotationInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 获取 ResultSetHandler 的处理结果
        Object result = invocation.proceed();

        if (result instanceof List) {
            List<?> resultList = (List<?>) result;

            for (Object obj : resultList) {
                if (obj == null) {
                    continue;
                }
                // 处理对象的字段
                processFields(obj);
            }
        }

        return result;
    }

    /**
     * 处理带有 @Excel 注解的字段，设置字典值
     */
    private void processFields(Object obj) throws IllegalAccessException {
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            // 检查字段是否带有 @Excel 注解
            if (field.isAnnotationPresent(Excel.class)) {
                field.setAccessible(true);

                // 获取当前字段的值
                Object value = field.get(obj);

                // 获取当前字段的字典值
                Excel excel = field.getDeclaredAnnotation(Excel.class);
                String converterExp = excel.readConverterExp();

                // 根据业务逻辑转换字典值，例如通过字典表或缓存
                if (value != null && converterExp != null && !"".equals(converterExp)) {
                    String dictValue = getDictValue(value.toString(), converterExp);
                    field.set(obj, dictValue);
                }
            }
        }
    }

    /**
     * 模拟获取字典值（可替换为实际字典查询逻辑）
     */
    private String getDictValue(String key, String converterExp) {
        // 字典数据存储在 converterExp 中
        String[] mappings = converterExp.split(","); // 按逗号分割
        for (String mapping : mappings) {
            String[] keyValue = mapping.split("="); // 按等号分割
            if (keyValue.length == 2 && keyValue[0].equals(key)) { // 判断值匹配
                return keyValue[1];
            }
        }

        return key; // 找不到时返回原始值
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 可以通过配置文件传递参数
    }
}
